package com.ittao.taoaicodeai.ai.tools;

import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.ittao.taoaicodemodel.model.dto.ImageResource;
import com.ittao.taoaicodemodel.model.enums.ImageCategoryEnum;
import dev.langchain4j.agent.tool.P;
import dev.langchain4j.agent.tool.Tool;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;

/**
 * 图片搜索工具（根据关键词来搜索）
 */
@Slf4j
@Component("PexelsImageSearchTool")
public class ImageSearchTool extends BaseTool {

    private static final String PEXELS_API_URL = "https://api.pexels.com/v1/search";

    @Value("${pexels.api-key}")
    private String pexelsApiKey;

    @Tool("搜索与具体内容高度相关的图片。要求：1)关键词必须具体明确，避免泛化词汇；2)优先使用英文关键词以提高搜索准确性；3)每次调用应针对单一明确的内容主题")
    public List<ImageResource> searchContentImages(@P("具体的搜索关键词，应描述明确的物体、场景或概念") String query) {
        List<ImageResource> imageList = new ArrayList<>();
        int searchCount = 10; // 每次搜索返回的图片数量
        
        // 调用 Pexels API 搜索图片
        try (HttpResponse response = HttpRequest.get(PEXELS_API_URL)
                .header("Authorization", pexelsApiKey)
                .form("query", query)
                .form("per_page", searchCount)
                .form("page", 1)
                .execute()) {
            
            if (response.isOk()) {
                JSONObject result = JSONUtil.parseObj(response.body());
                JSONArray photos = result.getJSONArray("photos");
                
                if (photos != null && !photos.isEmpty()) {
                    for (int i = 0; i < photos.size(); i++) {
                        JSONObject photo = photos.getJSONObject(i);
                        JSONObject src = photo.getJSONObject("src");
                        
                        // 构建图片资源对象
                        ImageResource imageResource = ImageResource.builder()
                                .category(ImageCategoryEnum.CONTENT.getValue())
                                .description(photo.getStr("alt", query))
                                .url(src.getStr("medium"))
                                .width(photo.getInt("width"))
                                .height(photo.getInt("height"))
                                .source("Pexels")
                                .build();
                        
                        imageList.add(imageResource);
                    }
                    log.info("成功搜索到 {} 张图片，关键词: {}", imageList.size(), query);
                } else {
                    log.warn("未找到相关图片，关键词: {}", query);
                }
            } else {
                log.error("Pexels API 调用失败，状态码: {}, 响应: {}", response.getStatus(), response.body());
            }
        } catch (Exception e) {
            log.error("图片搜索异常，关键词: {}, 错误: {}", query, e.getMessage(), e);
        }
        
        return imageList;
    }

    @Override
    public String getToolName() {
        return "searchContentImages";
    }

    @Override
    public String getDisplayName() {
        return "图片搜索工具";
    }

    @Override
    public boolean isInternalTool() {
        return true; // 标识为内部工具，不向前端显示调用信息
    }

    @Override
    public String generateToolExecutedResult(JSONObject arguments) {
        // 内部工具：完全静默执行，此方法返回值不会被使用
        return "";
    }
}
